/**
 * 
 */
package com.hpe.core.utils;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.NullArgumentException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.hpe.core.enums.ReportGroupEnum;

/**
 * 统计工具类
 * @author luolin
 *
 * @version $id:ReportUtils.java,v 0.1 2015年12月22日 上午10:23:38 luolin Exp $
 */
public class ReportUtils {
    /** 日志 */
    private static final Logger LOGGER = Logger.getLogger(ReportUtils.class);

    /**
     * 计算时间节点（按 小时/天/月 划分）
     * @param dateBegin 起始日期
     * @param dateEnd 结束日期
     * @return 时间节点、时间节点切片类型（参考{@link ReportGroupEnum}）
     * @Author : luolin. create at 2015年12月22日 上午10:26:50
     */
    public static Map<String, Object> datePointCut(String dateBegin, String dateEnd) {
        LOGGER.info("【计算时间节点（按 小时/天/月 划分）】dateBegin = " + dateBegin + " , dateEnd = " + dateEnd);
        // 参数校验
        validate(dateBegin, dateEnd);
        // 1、计算时间节点，用于填充空数据
        List<String> datePoint = null;
        try {
            datePoint = DateUtils.getDatePoint(dateBegin, dateEnd);
            Collections.reverse(datePoint);
        } catch (Exception e) {
            LOGGER.error("【计算时间节点失败】", e);
            throw new RuntimeException("计算时间节点失败");
        }

        // 3、根据日期取件获取日期分组条件：小时/天/月
        String groupByCondition = DateUtils.getGroupByCondition(dateBegin, dateEnd);

        Map<String, Object> commonData = new HashMap<String, Object>();
        commonData.put(DateUtils.DATE_POINT_TYPE, groupByCondition);
        commonData.put(DateUtils.DATE_POINT_RESULT, datePoint);
        return commonData;
    }

    /**
     * 计算时间节点（按 天/周/月 划分）
     * @param dateBegin 起始日期
     * @param dateEnd 结束日期
     * @return 时间节点、时间节点切片类型（参考{@link ReportGroupEnum}）
     * @Author : luolin. create at 2015年12月22日 上午10:26:50
     */
    public static Map<String, Object> datePointCutIncludeWeek(String dateBegin, String dateEnd) {
        LOGGER.info("【计算时间节点（按 天/周/月 划分）】dateBegin = " + dateBegin + " , dateEnd = " + dateEnd);
        // 参数校验
        validate(dateBegin, dateEnd);
        // 1、计算时间节点，用于填充空数据
        Map<String, Object> commonData = null;
        try {
            commonData = DateUtils.getDatePointInludeWeek(dateBegin, dateEnd);
        } catch (Exception e) {
            LOGGER.error("【计算时间节点失败】", e);
            throw new RuntimeException("计算时间节点失败");
        }

        return commonData;
    }

    /**
     * 参数校验
     * @param dateBegin 起始日期 
     * @param dateEnd 截止日期
     * @Author : luolin. create at 2015年12月22日 上午10:36:58
     */
    private static void validate(String dateBegin, String dateEnd) {
        if (StringUtils.isBlank(dateBegin)) {
            LOGGER.warn("【参数dateBegin为空】");
            throw new NullArgumentException("dateBegin");
        }
        if (StringUtils.isBlank(dateEnd)) {
            LOGGER.warn("【参数dateEnd为空】");
            throw new NullArgumentException("dateEnd");
        }
    }

}
